www.gusucode.com > VC++ 模仿MSN界面 > VC++ 模仿MSN界面/gusucode/MSN/MSNDlg.cpp

    //Download by http://www.NewXing.com
// MSNDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MSN.h"
#include "MSNDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include <mshtml.h>
#include  <comdef.h>
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMSNDlg dialog

CMSNDlg::CMSNDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMSNDlg::IDD, pParent)
{
	iShowButton = 0;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMSNDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMSNDlg)
	DDX_Control(pDX, 8001, m_MoveRight);
	DDX_Control(pDX, 8000, m_MoveLeft);
	DDX_Control(pDX, 14003, m_Search);
	DDX_Control(pDX, IDC_EXPLORER1, m_Browser);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMSNDlg, CDialog)
	//{{AFX_MSG_MAP(CMSNDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SIZE()
	ON_WM_NCCREATE()
	ON_WM_SIZING()
	ON_BN_CLICKED(8000, On8000)
	ON_BN_CLICKED(8001, On8001)
	ON_WM_GETMINMAXINFO()
	ON_WM_NCHITTEST()
	ON_WM_NCLBUTTONDOWN()
	ON_BN_CLICKED(1200, On1200)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMSNDlg message handlers

BOOL CMSNDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	CRect rc;
	GetClientRect(rc);

	CButton *btn = (CButton*)GetDlgItem(888);
	btn->MoveWindow(7, 2, 60, 60);

	CRect rctic;
	m_Browser.GetClientRect(rctic);

	m_Browser.MoveWindow(12, rc.Height()-108, rc.Width()-22, 62);

	CWnd *tic = (CWnd*)GetDlgItem(IDC_EXPLORER1);
	tic = (CStatic*)GetDlgItem(1500);
	tic->MoveWindow(12, rc.Height()-130, 30,14);

	///////////////////////////////////////////////////
	m_ILtabItem.Create(28, 28, ILC_MASK | ILC_COLOR32, 10, 10);
	
	CBitmap bmp;
	bmp.LoadBitmap(IDB_BITMAP2);

	ImageList_AddMasked(m_ILtabItem.m_hImageList, bmp, 0xff00ff);

	CTabCtrl *tab = (CTabCtrl *)GetDlgItem(IDC_TABITEM);
	tab->ModifyStyle(TCS_MULTILINE,0, 0);
	tab->SetImageList(&m_ILtabItem);   //   设置图标链标   
	::SendMessage(tab->m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(36,31));

	tab->MoveWindow(CRect(0, 127-28, 31, rc.Height()-133));


	TCITEM tcItem = {0};   
	tcItem.mask = TCIF_IMAGE;   

	tcItem.pszText = "";
	tcItem.cchTextMax = 30;

	for(int i = 0; i <7; i++)
	{
		tab->InsertItem(0, "" );
		tcItem.iImage = i;   //   图标索引   
		tab->SetItem( 0, &tcItem);
	}

	userlist.Create(IDD_DIALOG1, this);
	userlist.ShowWindow(SW_NORMAL);
	userlist.MoveWindow(32, 127-28, rc.Width()-31, rc.Height()-233);
	//SetWindowNoSkinHwnd(userlist.m_hWnd, FALSE);
	SetDialogEraseBkgnd(userlist.m_hWnd);

	CRect rcEditArea(20,4,125,17);
	m_Search.SetEditArea(rcEditArea);
	CRect rcButtonArea(128,3,143,18);
	m_Search.SetButtonArea(rcButtonArea);
	m_Search.SetOwner(this);
	m_Search.SetButtonClickedMessageId(WM_USER_EDITBUTTON_CLICKED);
	m_Search.SetButtonExistsAlways(FALSE);
	m_Search.SetBitmaps("bitmap2.bmp", "bitmap2_e.bmp");
	m_Search.MoveWindow(7, rc.Height()-42, rc.Width()-11, 32);
	HitButton();
	
	VARIANT vInfo; 
	vInfo.vt = VT_EMPTY; 
	m_Browser.Navigate("http://rad.msn.com/ADSAdClient31.dll?GetAd=&PG=IMSCHI&AP=1007",&vInfo,&vInfo,&vInfo,&vInfo); 
	m_Browser.SetVisible(TRUE); 

	SetColorize(0xf832ff);
	return TRUE;  
}

void CMSNDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMSNDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMSNDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMSNDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	Invalidate();
	
	CButton *btn = (CButton*)GetDlgItem(6000);
	
	if (btn==NULL) {
		return;
	}	
	btn->MoveWindow( 74, 11, cx - 26 - 74, 22);

	CTabCtrl *tab = (CTabCtrl *)GetDlgItem(IDC_TABITEM);
	tab->MoveWindow(CRect(0, 127-28, 31, cy-133));

	CEdit *edit = (CEdit*)GetDlgItem(14003);
	edit->MoveWindow(7, cy-42, cx-11, 32);

	CStatic *tic = (CStatic*)GetDlgItem(1500);
	tic->MoveWindow(12, cy-130, 30,14);

	userlist.MoveWindow(32, 127-28, cx-31, cy -233);


	CRect rctic;
	m_Browser.GetClientRect(rctic);
	
	if (cx-rctic.Width()<24) {
		m_Browser.MoveWindow(12, cy-108, cx-22, 62);
	}
	else
	{
		m_Browser.MoveWindow((cx-236)/2, cy-108, 236, 62);
	}
	HitButton();
}

BOOL CMSNDlg::OnNcCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (!CDialog::OnNcCreate(lpCreateStruct))
		return FALSE;
	SetWindowSkinResID(m_hWnd, 777);
	return TRUE;
}

BEGIN_EVENTSINK_MAP(CMSNDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CMSNDlg)
	ON_EVENT(CMSNDlg, IDC_EXPLORER1, 259 /* DocumentComplete */, OnDocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMSNDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL) 
{
	HRESULT hr = S_OK;   
	IWebBrowser2* pWB = NULL;   
	hr = pDisp->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void**>(&pWB));   
    
	IDispatch* pDocDisp = NULL;   
	hr = pWB->get_Document(&pDocDisp);   
	if(pDocDisp)   
	{   
		VARIANT v;   
		VariantInit(&v);   
		IHTMLDocument2* pDoc = NULL;   
		hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&pDoc));   
		
		IHTMLElement* pElement = NULL;   
		hr = pDoc->get_body(&pElement);   
		
		IHTMLBodyElement* pBodyElement = NULL;   
		hr = pElement->QueryInterface(IID_IHTMLBodyElement, (void**)&pBodyElement);   
		
		if(pBodyElement)   
		{   
			pBodyElement->put_scroll(::SysAllocString(L"no"));
			
			_variant_t v;   
			v.vt = VT_INT;   
			v.intVal = 0;
			pBodyElement->put_leftMargin(v);
			pBodyElement->put_topMargin(v);
			pBodyElement->Release();   
		}   
		pElement->Release();   
		pDoc->Release();   
		pDocDisp->Release();   
	}   

	pWB->Release();   	
}

void CMSNDlg::OnSizing(UINT fwSide, LPRECT pRect) 
{
	CDialog::OnSizing(fwSide, pRect);
	//m_Browser.SetRedraw(false);
}

void CMSNDlg::HitButton()
{
	//1201 -- 1204
	int iWidth = WIDTH1201 + WIDTH1202 + WIDTH1203 + WIDTH1204 + 2 * 3; //间距2
	CRect rc;
	GetClientRect(rc);
	m_MoveLeft.MoveWindow(9, 71, 12, 24);
	m_MoveRight.MoveWindow( rc.right-74-13, 71, 12, 24);
	//如果足够宽,左右按扭不显示
	if (rc.Width()-9-86>iWidth) {
		iShowButton = 0;
		CButton *btn = NULL;
		for(int i = 0; i <4; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i);
			btn->ShowWindow(SW_NORMAL);
			btn->MoveWindow(10+(26+2)*i, 99-28, 26, 24);
		}
		m_MoveLeft.ShowWindow(SW_HIDE);
		m_MoveRight.ShowWindow(SW_HIDE);
	}
	else if(rc.Width()-9-86 > WIDTH1201*3 + 2*3 + 12) //3 BUTTON + 1 LEFTRIGHT
	{
		//显示3个按扭1个左右
		CButton *btn = NULL;
		for(int i = 0; i < 3; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i + iShowButton);
			btn->ShowWindow(SW_NORMAL);
			btn->MoveWindow( (iShowButton==0?0:12+2) + 10+(26+2)*i, 99-28, 26, 24);
			btn->Invalidate();
		}
		if ( iShowButton ==0) {
			btn = (CButton*)GetDlgItem(1204);
			btn->ShowWindow(SW_HIDE);
			m_MoveRight.ShowWindow(SW_NORMAL);
			m_MoveLeft.ShowWindow(SW_HIDE);
		}
		else{
			btn = (CButton*)GetDlgItem(1201);
			btn->ShowWindow(SW_HIDE);
			m_MoveRight.ShowWindow(SW_HIDE);
			m_MoveLeft.ShowWindow(SW_NORMAL);
		}
	}
	else if(rc.Width()-9-86 > WIDTH1201*2 + 2*2 + 12)
	{
		//显示2个按扭2个左右
		CButton *btn = NULL;
		for(int i = 0; i < 4; i++)
			{
				btn = (CButton*)GetDlgItem(1201 + i);
				btn->ShowWindow(SW_HIDE);
			}	

		for( i = 0; i < 2; i++)
		{
			if (iShowButton==3&&i==1) {
				break;
			}
			btn = (CButton*)GetDlgItem(1201 + i + iShowButton);
			btn->ShowWindow(SW_NORMAL);
			btn->MoveWindow( (iShowButton==0?0:12+2) + 10+(26+2)*i, 99-28, 26, 24);
			btn->Invalidate();
		}
		
		if ( iShowButton ==0) {
			m_MoveRight.ShowWindow(SW_NORMAL);
			m_MoveLeft.ShowWindow(SW_HIDE);
		}
		else if (iShowButton ==3) {
			m_MoveRight.ShowWindow(SW_HIDE);
			m_MoveLeft.ShowWindow(SW_NORMAL);
		}
		else
		{
			m_MoveRight.ShowWindow(SW_NORMAL);
			m_MoveLeft.ShowWindow(SW_NORMAL);
		}
	}
	else
	{
		//显示1个按扭2个左右
		//
		int c = (float)(rc.Width()-9-86 - 24+4) / (float)(WIDTH1201+2);
		CButton *btn = NULL;
		for(int i = 0; i < 4; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i);
			btn->ShowWindow(SW_HIDE);
		}	
		
		for( i = 0; i < 1; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i + iShowButton);
			btn->ShowWindow(SW_NORMAL);
			btn->MoveWindow( (iShowButton==0?0:12+2) + 10+(26+2)*i, 99-28, 26, 24);
			btn->Invalidate();
		}
		
		if ( iShowButton ==0) {
			m_MoveRight.ShowWindow(SW_NORMAL);
			m_MoveLeft.ShowWindow(SW_HIDE);
		}
		else if (iShowButton ==3) {
			m_MoveRight.ShowWindow(SW_HIDE);
			m_MoveLeft.ShowWindow(SW_NORMAL);
		}
		else
		{
			m_MoveRight.ShowWindow(SW_NORMAL);
			m_MoveLeft.ShowWindow(SW_NORMAL);
		}
	}
}

void CMSNDlg::On8000() 
{
	//move left
	if (iShowButton>0) {
		iShowButton--;
		CButton *btn = NULL;
		for(int i = 0; i < 4; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i);
			btn->ShowWindow(SW_HIDE);
		}	
		HitButton();
	}
}

void CMSNDlg::On8001() 
{
	//move right
	if (iShowButton<3) {
		iShowButton++;
		CButton *btn = NULL;
		for(int i = 0; i < 4; i++)
		{
			btn = (CButton*)GetDlgItem(1201 + i);
			btn->ShowWindow(SW_HIDE);
		}	
		HitButton();
	}
}

BOOL CMSNDlg::PreTranslateMessage(MSG* pMsg) 
{
	if ((pMsg->message == WM_RBUTTONDOWN)||(pMsg->message == WM_RBUTTONDBLCLK)){
		return TRUE;
	}
		
	return CDialog::PreTranslateMessage(pMsg);
}

void CMSNDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	// TODO: Add your message handler code here and/or call default
	lpMMI->ptMinTrackSize.x = 153;//   m_MinSize为最小尺寸   
	lpMMI->ptMinTrackSize.y = 302;//   m_MinSize为最小尺寸
	CDialog::OnGetMinMaxInfo(lpMMI);
}

void CMSNDlg::On1200() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}